﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using PSE.Updater.Common.Gateway.DataContract;

namespace PSE.Updater.Client.UI
{
    public partial class Default : Window
    {
        public enum ScreenType
        { 
            Initialize,
            Install,
            InstallError,
            Finalize
        }

        public Action OnInstallNowClick { private get; set; }
        public Action OnPostponeClick { private get; set; }
        public Action<int, int, bool> OnScheduleUpdateClick { private get; set; }
        public Action OnCloseClick { private get; set; }
        public Action OnCancelClick { get; set; }
        public Action OnFinalizeClick { get; set; }

        public IEnumerable<ModuleUpdatePackage> ModulesUpdatePackage { private get; set; }

        public string UpdateDescription
        {
            get { return (string)GetValue(UpdateDescriptionProperty); }
            set { SetValue(UpdateDescriptionProperty, value); }
        }
        public static readonly DependencyProperty UpdateDescriptionProperty =
            DependencyProperty.Register("UpdateDescription", typeof(string), typeof(Default), new UIPropertyMetadata(null));

        public ScreenType Screen { get; set; }

        public Default()
        {
            this.DataContext = this;
            InitializeComponent();
        }

        private void InitializeScreen()
        {
            txtTitle.Text = "As seguintes atualizações estão disponíveis para instalação neste computador:";
            txtFooter.Content = string.Empty;

            btnCommand1.Content = "Instalar agora";
            btnCommand1.Visibility = Visibility.Visible;
            btnCommand1.Click += (sender, e) =>
            {
                if (this.OnInstallNowClick != null)
                    this.OnInstallNowClick();
            };

            btnCommand2.Content = "Avisar em 1 hora";
            btnCommand2.Visibility = Visibility.Visible;
            btnCommand2.Click += (sender, e) =>
            {
                PSE.Framework.UI.Controls.SmartClient.MessageBox.Show("Você será lembrado novamente para a instalação dos aplicativos em 1 (uma) hora.");

                if (this.OnPostponeClick != null)
                    this.OnPostponeClick();
            };

            btnCommand3.Content = "Programar um horário";
            btnCommand3.Visibility = Visibility.Visible;
            btnCommand3.Click += (sender, e) =>
            {
                Schedule schedule = new Schedule();
                schedule.ShowDialog();
                if (!schedule.IsClosed)
                {
                    if (this.OnScheduleUpdateClick != null)
                        this.OnScheduleUpdateClick(schedule.GetHours, schedule.GetMinutes, schedule.GetInstallOnWinStart);
                    this.Close();
                }
            };
        }

        private void InstallScreen()
        {
            txtTitle.Text = "As seguintes atualizações estão sendo instaladas neste computador:";
            txtFooter.Content = string.Empty;

            btnCommand3.Content = "Cancelar";
            btnCommand3.Visibility = Visibility.Visible;
            btnCommand3.Click += (sender, e) =>
            {
                if (this.OnCancelClick != null)
                    this.OnCancelClick();
            };
        }

        private void InstallErrorScreen()
        {
            txtTitle.Text = "A atualização dos aplicativos BM&FBOVESPA apresentou erros. Veja abaixo a lista de aplicativos e seu status:";
            //txtFooter.Content = "Os erros já foram enviados para seu administrador de rede. Clique no botão \"Finalizar\" para fechar este aplicativo...";
            txtFooter.Content = "Clique no botão \"Finalizar\" para fechar este aplicativo...";

            btnCommand3.Content = "Finalizar";
            btnCommand3.Visibility = Visibility.Visible;
            btnCommand3.Click += (sender, e) =>
            {
                this.Close();

                if (this.OnFinalizeClick != null)
                    this.OnFinalizeClick();
            };
        }

        private void FinalizeScreen()
        {
            txtTitle.Text = "Veja abaixo a lista de aplicativos e seu status:";
            txtFooter.Content = "clique em finalizar para fechar este aplicativo.";

            btnCommand3.Content = "Finalizar";
            btnCommand3.Visibility = Visibility.Visible;
            btnCommand3.Click += (sender, e) =>
            {
                this.Close();

                if (this.OnFinalizeClick != null)
                    this.OnFinalizeClick();
            };
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            dtgPackages.ItemsSource = this.ModulesUpdatePackage;

            txtTitle.Text = string.Empty;
            txtFooter.Content = string.Empty;

            btnCommand1.Visibility = Visibility.Hidden;
            btnCommand2.Visibility = Visibility.Hidden;
            btnCommand3.Visibility = Visibility.Hidden;

            switch (this.Screen)
            {
                default:
                case ScreenType.Initialize:
                    InitializeScreen();
                    break;
                case ScreenType.Install:
                    InstallScreen();
                    break;
                case ScreenType.InstallError:
                    InstallErrorScreen();
                    break;
                case ScreenType.Finalize:
                    FinalizeScreen();
                    break;
            }
        }

        private void dtgPackages_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var selectedItem = dtgPackages.SelectedItem as ModuleUpdatePackage;
            if (selectedItem != null)
                this.UpdateDescription = selectedItem.UpdateDescription;
        }
    }
}